<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 111 ,222,111111,444,555,777,101010
        //    同步代码优先执行
        // console.log(111);
        // const promise = new Promise((resolve, reject) => {
        //     reject();
        //     //需要注意： promise本身是同步代码，只是它里面的定时器回调函数是异步的
        //     console.log(222);
        // });
        // promise
        //     // 这里不会调用
        //     .then(() => {
        //         console.log(333);
        //         return new Promise((resolve) => {
        //             reject();
        //         });
        //     })
        //     // 17行成功执行这里打印 444 返回fulfilled  undefined
        //     .catch(() => {
        //         console.log(444);
        //     })
        //     // 31行因为是成功所以执行这里打印555 返回fulfiled undefined
        //     .then(() => {
        //         console.log(555);
        //         return new Promise((reject, resolve) => {
        //             // 这里有个坑reject是成功状态
        //             reject();
        //             // resolve();
        //         });
        //     })
        //     // 38行成功直接穿透
        //     .catch(() => {
        //         console.log(666);
        //         throw new Error("报错了~");
        //     })
        //     // 38行返回成功后调用这里然后报错跳过52,53,执行54行
        //     .then(() => {
        //         console.log(777);
        //         throw new Error("报错了~");
        //     })
        //     .then(() => console.log(888))
        //     .then(() => console.log(999))
        //     .catch(() => console.log(101010));
        // // 这里也是同步代码
        // console.log(111111);



        // new Promise((resolve, reject) => {
        //         console.log("开始请求A数据......")
        //         try {
        //             setTimeout(() => {
        //                 console.log("A数据请求成功");
        //                 //模拟请求回来的数据
        //                 const username = {
        //                     user: "laoliu"
        //                 }
        //                 resolve(username)
        //             }, 1500)
        //         } catch (e) {
        //             reject(e.message)
        //         }
        //     })
        //     // 返回{user: "laoliu"}
        //     .then(value => {
        //         return new Promise((resolve, reject) => {
        //             console.log("开始请求B数据......")
        //             try {
        //                 setTimeout(() => {
        //                     console.log("B数据请求成功");
        //                     //模拟请求回来的数据
        //                     const age = {
        //                         age: 18
        //                     }
        //                     resolve({
        //                         ...value,
        //                         ...age
        //                     })
        //                     // resolve(Object.assign({}, value, age))
        //                 }, 1500)
        //             } catch (e) {
        //                 reject(e.message)
        //             }
        //         })
        //     })
        //     // 返回{user: "laoliu"，age:18}
        //     .then(value => {
        //         return new Promise((resolve, reject) => {
        //             console.log("开始请求C数据......")
        //             try {
        //                 setTimeout(() => {
        //                     console.log("C数据请求成功");
        //                     //模拟请求回来的数据
        //                     const sex = {
        //                         sex: "男"
        //                     }
        //                     resolve({
        //                         ...value,
        //                         ...sex
        //                     })
        //                 }, 1500)
        //             } catch (e) {
        //                 reject(e.message)
        //             }
        //         })
        //     })
        //     // 返回{user: "laoliu"，age:18 ,sex:男}
        //     .then(value => {
        //         //处理value
        //         console.log(value);
        //     })

        //     .catch(reason => {
        //         console.log("这里是异常处理");
        //     })

        //1
        Promise.resolve(1)
        // 穿透
          .then(2)
        //   相当于then(3)穿透
          .then(Promise.resolve(3)) //成功 1
        //   then会直接调用（）里的函数并传递参数
          .then(console.log)


        //2
        Promise.resolve("foo")
        // 穿透
          .then(Promise.resolve("hoo"))
          
          .then((value) => {
            console.log(value);//foo
          })
        
        //3
        Promise.resolve(1)
        // 返回成功2
          .then(() => {
            return 2
          })
        //   穿透
          .then(Promise.resolve(3))
          .then(console.log)//2

        //4
        Promise.resolve(1)
        // 返回成功2
          .then(() => {
            return 2
          })
        //   返回成功3
          .then(() => {
            return Promise.resolve(3)
          })
          .then(console.log)//3


        //5
        new Promise((resolve, reject) => {
            reject(1)
          })
          .then(value => {
            console.log('成功', value);
            // 失败调用第二个参数的函数
          }, reason => {
            console.log('失败', reason); //打印失败 1  返回成功undefined
          })
          .then(value => {
            console.log('成功', value); //成功 undefined
          }, reason => {
            console.log('失败', reason);
          })
          .catch(reason => console.log('失败', reason))

        //6
        new Promise((resolve, reject) => {
            reject(1)
          })
          .then(value => {
            console.log('成功', value);
          })
          .then(value => {
            console.log('成功', value);
          })
          .catch(reason => console.log('失败', reason))//失败 1
        


        //7
        new Promise((resolve, reject) => {
            reject(1)
          })
          .then(value => {
            console.log('成功', value);
          })
          .then(value => {
            console.log('成功', value);
          }, reason => {
            console.log('失败hhhhh', reason);//失败hhhh 1
          })
          .catch(reason => console.log('失败', reason))


        //8
        //1 2 4 3
        const promise = new Promise((resolve, reject) => {
          console.log(1)
          resolve()
        //   promise函数本身是同步代码
          console.log(2)
        })
        // then是同步但里面的回调函数是异步
        promise.then(() => {
          console.log(3)
        })
        console.log(4)


        //9
        const promise = new Promise((resolve, reject) => {
          resolve('1')
        //   下面不会执行只能由pending状态改为其他值
          reject('error')
          resolve('2')
        })

        promise
          .then((data) => {
            console.log(data)//1
          })
          .catch((err) => {
            console.log(err)
          })


        //10
        Promise.resolve(1)
            .then((data) => {
                console.log(data) //1
                return 2
            })
            .catch((err) => {
                return 3
            })
            .then((data) => {
                console.log(data) //2
            })
    </script>
</body>

</html>